home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
language
/
modula.zoo
/
_defn_windowba.def
< prev
next >
Wrap
Text File
|
1988-04-26
|
13KB
|
329 lines
DEFINITION MODULE WindowBase; (* Hans Endl 25. 09. 1986 *)
(* 02. 06. 1987 *)
(* 01. 10. 1987 *)
FROM SYSTEM IMPORT ADDRESS;
FROM GEMVDIbase IMPORT PxyArrayType;
(* Dieses Modul stellt eine Zwischenschicht zur Fensterprogrammierung
zur Verfügung, die etwas komfortablere Funktionen als die reinen
AES-Aufrufe enthält, aber nicht so sehr einschränkt wie die auf
MEDOS basierenden Moduln "Windows", "TextWindows" und "Graphic-
"Windows".
Wichtige Bestandteile von "WindowBase" sind
- die Struktur "windowtype", die die unter AES am häufigsten
benötigten Fensterdaten enthält
- Prozeduren zum Setzen der Schieber
- die automatische Abarbeitung der Rechteckliste bei Redraw-
Aufrufen
*)
CONST
maxwindow = 12; (* 7 Fenster in GEM-AES möglich + 5 für Debugger *)
deskhandle = 0;
TYPE
window = INTEGER;
(* Aus Gründen der Kompatibilität zu AES und MEDOS wird zur Iden-
tifikation eines Fensters nicht ein Zeiger auf den unten defi-
nierten Window-Record benutzt, sondern eine Integer-Zahl, die
mit dem AES-Window-Handle identisch ist und als Index eines
Feldes von Window-Records fungiert.
*)
rectangle = RECORD
x: INTEGER; (* x-Koordinate der linken oberen Ecke *)
y: INTEGER; (* y-Koordinate der linken oberen Ecke *)
w: INTEGER; (* Breite *)
h: INTEGER (* Höhe *)
END;
(* Definition eines Rechtecks in AES-spezifischer Form mit linker
oberer Ecke und Breite und Höhe in Pixeln, im Gegensatz zu der
vom VDI meist benutzten Form des PxyArrays, das durch zwei dia-
gonal gegenüberliegende Ecken definiert wird.
*)
RedrawProcType = PROCEDURE (window, rectangle);
WindowElement = (Title, CloseButton, FullButton, Moveable,
InfoLine, SizeButton, UpArrow, DownArrow,
VertSlider, LeftArrow, RightArrow, HorizSlider);
WindowElements = SET OF WindowElement;
CONST
AllElements = WindowElements {Title..HorizSlider};
NoElements = WindowElements{};
TYPE
wstring = ARRAY [0..79] OF CHAR; (* String für Titel und Info *)
windowtype = RECORD
handle: INTEGER; (* AES-Fensternummer *)
max: rectangle; (* Maximale Fenstergröße *)
total: rectangle; (* Aussenmasse des Fensters *)
work: rectangle; (* Innenmasse des Fensters *)
elements: WindowElements; (* Menge der Fensterelemente*)
fulled: BOOLEAN; (* Fenster auf max gesetzt *)
opened: BOOLEAN; (* Fenster geöffnet *)
ontop: BOOLEAN; (* TRUE, falls oberstes F. *)
text: BOOLEAN; (* TRUE, falls Textfenster *)
row, col: INTEGER; (* Zeile und Spalte bei Text*)
maxrow: INTEGER; (* letzte sichtbare Zeile *)
maxcol: INTEGER; (* letzte sichtbare Spalte *)
colour: INTEGER; (* Hintergrundfarbe *)
style: INTEGER; (* Fülltyp für Hintergrund *)
textcolour: INTEGER; (* Farbe des Textes *)
redrawproc: RedrawProcType; (* Redraw-Procedure *)
title: wstring; (* Titelzeile *)
info: wstring; (* Informationszeile *)
reference: ADDRESS; (* frei für Anwender *)
END;
windowptr = POINTER TO windowtype;
VAR
windowlist: ARRAY [0..maxwindow] OF windowtype;
handlelist: ARRAY [0..7] OF window;
growbox: BOOLEAN; (* Wenn diese Variable auf TRUE gesetzt ist,
wachsen bzw. schrumpfen die Fenster beim
Öffnen bzw. Schliessen, default = TRUE *)
PROCEDURE createWindow (VAR u: window;
x, y, w, h: INTEGER;
parts: WindowElements;
title: ARRAY OF CHAR;
textwindow: BOOLEAN;
rdp: RedrawProcType);
(* Erzeugt die im AES und in diesem Modul notwendigen Datenstrukturen
zur Verwaltung eines Fensters, das jedoch noch nicht gezeichnet
wird.
x, y, w und h beschreiben die maximale Grösse des äusseren Fenster-
randes. Sind w und h gleich 0, so wird die Grösse des Desktops
ohne Menüleiste übernommen.
"parts" ist ein Set aus den gewünschten Fensterelementen.
"title" ist der Fenstertitel.
"textwindow" soll bei Textfenstern auf TRUE gesetzt werden,
der Fensterursprung wird dann an das Textraster angepaßt.
"rdp" ist die Redraw-Prozedur, also die Prozedur, die den Inhalt
des Fensters zeichnet. Sie wird beim Aufruf der Prozedur "DoRedraw"
(siehe unten) so oft aufgerufen wird, bis die Rechteckliste, die
die sichtbaren Teile des Fensters angibt, abgearbeitet worden ist.
An "rdp" wird beim Aufruf ein Rechteck übergeben, das die neu
zu zeichnende Fläche angibt. Wurde beim Aufruf von "DoRedraw"
der Paramter "clip" auf FALSE gesetzt, muss "rdp" alle Ausgaben
selbst auf diese Fläche begrenzen, was die Ausgabe vor allem bei
Text stark beschleunigen kann, aber bei teilweise verdeckten Fen-
stern kaum durchführbar ist. Beim Zeichnen von Objektbäumen wird
das Begrenzungsrechteck direkt beim "ObjectDraw"-Aufruf angegeben.
*)
PROCEDURE activate (u: window);
(* aktiviert ein deaktiviertes Fenster wieder *)
PROCEDURE deactivate (u: window);
(* Deaktiviert ein Fenster, indem ein AES.WindowDelete durchgeführt
wird. Das Fenster existiert dann für GEM-AES nicht mehr, der Fen-
sterdeskriptor wird jedoch nicht freigegeben, so daß das Fenster
später mit "activate" mit den alten Parametern wieder aktiviert
werden kann. Dadurch können mehr als die sieben von GEM-AES zuge-
lassenen Fenster verwaltet werden, es können jedoch immer nur
maximal sieben aktiv sein. *)
PROCEDURE clearWindow (u: window);
PROCEDURE closeWindow (u: window);
PROCEDURE deleteWindow (u: window);
PROCEDURE fullWindow (u: window);
PROCEDURE openWindow (u: window; x, y, w, h: INTEGER);
PROCEDURE setWindow (u: window; x, y, w, h: INTEGER);
PROCEDURE topWindow (u: window);
PROCEDURE MouseOn;
PROCEDURE MouseOff;
(* Vor Ausgaben auf den Bildschirm muss die Maus ausgeschaltet werden,
da sonst das Maussymbol überschrieben wird und bei der nächsten
Bewegung der Maus der alte, zuvor von der Maus verdeckte Bildschirm-
inhalt wieder restauriert wird. Alle Prozeduren in diesem Modul, die
den Bildschirm verändern, schalten die Maus während der Ausgabe aus.
Während des Aufrufs der vom Benutzer bereitgestellten Redraw-Prozedur
beim Abarbeiten der Rechteckliste in "DoRedraw" wird die Maus eben-
falls ausgeschaltet, ruft der Benutzer dagegen selbst seine Redraw-
Prozedur auf oder benutzt er die weiter unten beschriebenen Textaus-
gabeprozeduren, muss er sich selbst um die Maus kümmern.
Achtung: Ein- und Ausschalten der Maus wird vom Betriebssystem
mitgezählt. Wird die Maus mehrmals ausgeschaltet, muß
sie genausooft wieder eingeschaltet werden, damit sie
sichtbar wird. Wird die Maus zu oft eingeschaltet, dann
entstehen beim Bewegen von Fenstern und Schiebern Schmutz-
effekte.
*)
PROCEDURE SetHorSlider (u: window; wpos, wsize, total: INTEGER);
(* siehe "SetVertSlider", setzt den h